package com.wjf.concurrency.example.singleton;

import com.wjf.concurrency.annoations.ThreadSafe;

/*
* 懒汉模式 -》 双重同步锁单例模式
* 单例实例在第一次运行时进行创建
* */
@ThreadSafe
public class SingletonExample5 {

    //私有的构造函数
    private SingletonExample5(){

    }

    //单例对象  volatile + 双重检测机制   - > 来禁止指令重排序
    public  volatile static SingletonExample5 intance=null;

    //静态的工厂方法
    public static SingletonExample5 getInstance(){
        if (intance ==null){  //双重检测机制      // B 线程
            synchronized (SingletonExample5.class){  // 同步锁
                if (intance ==null){
                    //1. memory= allocate() 分配对象的内存空间
                    //2. ctorInstance() 初始化对象
                    //3. instance=memory 设置instance 指向刚分配的内存
                    intance=new SingletonExample5();   // A 线程 处于 3
                }
            }
        }
        return intance;
    }
}
